/*
 * Licensed to the 南京汇海交通科技有限公司
 *
 * Copyright (c) 2025.
 * All rights reserved.
 *
 * 本软件属南京汇海交通科技有限公司所有，在未获得南京汇海交通科技有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.chframework.poi;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.util.CellAddress;

/**
 * 描述：坐标解析器 - 解析单元格坐标得到其所表示的行索引与列索引
 * 日期：2022-02-28
 * 作者：周孝兵
 */
@Getter
@ToString
@EqualsAndHashCode
public final class CoordinateParser {
// CHECKSTYLE:OFF

    public CoordinateParser(String coordinate) {
        if (StringUtils.isNotBlank(coordinate)) {
            CellAddress cellAddr = new CellAddress(coordinate);

            this.row = cellAddr.getRow();
            this.column = cellAddr.getColumn();
            this.coordinate = coordinate;
        }
    }

    public CoordinateParser(int row, int column) {
        CellAddress cellAddr = new CellAddress(row, column);

        this.row = row;
        this.column = column;
        this.coordinate = cellAddr.formatAsString();
    }

    /**
     * 行索引
     */
    private int row;

    /**
     * 列索引
     */
    private int column;

    /**
     * 单元格的坐标
     */
    private String coordinate;

    /**
     * 根据索引获取单元格的列名
     */
    public static String getCellTagOnAxis(int columnIndex) {
        StringBuilder temp = new StringBuilder();
        double i = Math.floor(Math.log(25.0 * (columnIndex) / 26.0 + 1) / Math.log(26)) + 1;
        if (i > 1) {
            double sub = columnIndex - 26 * (Math.pow(26, i - 1) - 1) / 25;
            for (double j = i; j > 0; j--) {
                temp.append((char) (sub / Math.pow(26, j - 1) + 65));
                sub = sub % Math.pow(26, j - 1);
            }
        } else {
            temp.append((char) (columnIndex + 65));
        }
        return temp.toString();
    }

// CHECKSTYLE:ON
}
